package br.iesb.exporter;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;

import br.iesb.bean.Posicao;
import br.iesb.bean.Tabuleiro;
import br.iesb.bean.boat.ETipoArquivo;
import br.iesb.bean.boat.Embarcacao;

public class FileExporter {

    public File doExportToFile(Tabuleiro tabuleiro, final ETipoArquivo sufix) {
        String xml = "";
        if (sufix.equals(ETipoArquivo.XML)) {
            xml = doExport(tabuleiro);
        } else if (sufix.equals(ETipoArquivo.JSON)) {
            xml = criaArquivoJson(tabuleiro);
        }

        try {
            JFileChooser chooser = new JFileChooser();
            chooser.setFileFilter(new FileFilter() {

                @Override
                public String getDescription() {
                    return "Arquivo " + sufix.toString().toUpperCase();
                }

                @Override
                public boolean accept(File file) {
                    return file.getName().toLowerCase().endsWith("." + sufix.toString());
                }
            });
            chooser.showSaveDialog(null);
            chooser.setMultiSelectionEnabled(false);
            File arquivo = chooser.getSelectedFile();
            if (arquivo.createNewFile()) {
                FileOutputStream fos = new FileOutputStream(arquivo);
                fos.write(xml.getBytes());
                fos.flush();
            }
            return arquivo;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }

    }

    public static String criaArquivoJson(Tabuleiro tab) {

        String jsonSaida = "";

        jsonSaida += "{ \"tabuleiro\" :[ {" + "\n"
                + "\t\"qtLinha\":\"" + tab.getQtLinhas() + "\"," + "\n"
                + "\t\"qtColunas\":\"" + tab.getQtColunas() + "\"," + "\n"
                + "\t\"qtSubmarinos\":\"" + tab.getQtSubmarino() + "\"," + "\n"
                + "\t\"qtDestroyer\":\"" + tab.getQtDestroyer() + "\"," + "\n"
                + "\t\"qtCruzador\":\"" + tab.getQtCruzador() + "\"," + "\n"
                + "\t\"qtEncouracado\":\"" + tab.getQtEncouracado() + "\"," + "\n"
                + "\t\"qtPortavioes\":\"" + tab.getQtportaAvioes() + "\"" + "\n"
                + "}] ,";

        jsonSaida += " \"Posicoes\" :[" + "\n";

        for (Posicao posicao : tab.getPosicoes()) {

            jsonSaida += "{" + "\n"
                    + "\t\"linha\":\"" + posicao.getLinha() + "\"," + "\n"
                    + "\t\"coluna\":\"" + posicao.getColuna() + "\"," + "\n"
                    + "\t\"estado\":\"" + posicao.getEstado() + "\"" + "\n"
                    + "}," + "\n";

        }

        jsonSaida = jsonSaida.substring(0, jsonSaida.length() - 2);
        jsonSaida += "], \"Embarcacoes\" : [  " + "\n";
        for (Embarcacao barco : tab.getColEmbarcacao()) {

            jsonSaida += "{" + "\n"
                    + "\t\"tipoNavio\":\"" + barco.getNome() + "\"," + "\n"
                    + "\t\"posInicialLinha\":\"" + barco.getPosicaoInicial().getLinha() + "\"," + "\n"
                    + "\t\"posInicialColuna\":\"" + barco.getPosicaoInicial().getColuna() + "\"," + "\n"
                    + "\t\"orientacaoHorizontal\":\"" + barco.isInHorizontal() + "\"" + "\n"
                    + "}," + "\n";

        }
        jsonSaida = jsonSaida.substring(0, jsonSaida.length() - 2);
        jsonSaida += "]}" + "\n";

        return jsonSaida;
    }

    public String doExport(Tabuleiro tabuleiro) {
        String retorno = "<?xml version='1.0' encoding='UTF-8'?>\n";
        retorno = retorno
                +
                String.format(
                        "<tabuleiro qtLinhas='%d' qtColunas='%d' qtSubmarino='%d' qtDestroyer='%d' qtCruzador='%d' qtEncouracado='%d' qtPortavioes='%d'>\n",
                        tabuleiro.getQtLinhas(), tabuleiro.getQtColunas(), tabuleiro.getQtSubmarino(),
                        tabuleiro.getQtDestroyer(), tabuleiro.getQtCruzador(), tabuleiro.getQtEncouracado(),
                        tabuleiro.getQtportaAvioes());

        retorno = retorno + "\t<embarcacoes>\n";
        for (Embarcacao e : tabuleiro.getColEmbarcacao()) {
            retorno = retorno + "\t\t<embarcacao>\n";
            retorno = retorno + "\t\t\t<vida>" + e.getVida() + "</vida>\n";
            retorno = retorno + "\t\t\t<tamanho>" + e.getTamanho() + "</tamanho>\n";
            retorno = retorno + "\t\t\t<nome>" + e.getNome() + "</nome>\n";
            retorno = retorno + "\t\t\t<inHorizontal>" + e.isInHorizontal() + "</inHorizontal>\n";
            retorno = retorno + "\t\t\t<posicaoInicial>\n";
            retorno = retorno + exportarPosicao(e.getPosicaoInicial(), "\t\t\t\t");
            retorno = retorno + "\t\t\t</posicaoInicial>\n";

            retorno = retorno + "\t\t\t<posicoesOcupadas>\n";
            for (Posicao po : e.getPosicoesOcupadas()) {
                retorno = retorno + "\t\t\t\t<posicao>\n";
                retorno = retorno + exportarPosicao(po, "\t\t\t\t\t");
                retorno = retorno + "\t\t\t\t</posicao>\n";
            }
            retorno = retorno + "\t\t\t</posicoesOcupadas>\n";
            retorno = retorno + "\t\t</embarcacao>\n";
        }
        retorno = retorno + "\t</embarcacoes>\n";

        retorno = retorno + "\t<posicoes>\n";
        for (Posicao p : tabuleiro.getPosicoes()) {
            retorno = retorno + "\t\t<posicao>\n";
            retorno = retorno + exportarPosicao(p, "\t\t\t");
            retorno = retorno + "\t\t</posicao>\n";
        }
        retorno = retorno + "\t</posicoes>\n";

        retorno = retorno + "</tabuleiro>\n";
        return retorno;
    }

    private String exportarPosicao(Posicao p, String tabulacao) {
        String retorno = tabulacao + "<linha>" + p.getLinha() + "</linha>\n";
        retorno = retorno + tabulacao + "<coluna>" + p.getColuna() + "</coluna>\n";
        retorno = retorno + tabulacao + "<inOcupada>" + p.isInOcupada() + "</inOcupada>\n";
        retorno = retorno + tabulacao + "<estado>" + p.getEstado() + "</estado>\n";
        return retorno;
    }

}
